home *** CD-ROM | disk | FTP | other *** search
/ Just Call Me Internet / Just Call Me Internet.iso / prog / atari / c / stut_src / gem_dirs.c < prev    next >
Text File  |  1996-05-27  |  6KB  |  287 lines

  1. /*
  2.  * SvrFlSel.c
  3.  *
  4.  * Purpose:
  5.  * -------- 
  6.  * S‚lecteur de fichiers
  7.  *
  8.  * History:
  9.  * --------
  10.  * 22.01.95: fplanque: Created
  11.  */
  12.  
  13.  
  14.      #include "!OPTIONS.H"                /* Options de compilation */         
  15.     #define    THIS_FILE    "GEM_DIRS.C v1.00 - 03.95"
  16.           
  17.  
  18. /*
  19.  * System headers:
  20.  */
  21.     #include    <stdio.h>                    /* header standard */
  22.     #include <string.h>                    /* header tt de chaines */
  23.     #include    <stdlib.h>                    /* Pour malloc etc.. */
  24.    #include <tos.h>
  25.     #include <time.h>
  26.  
  27. /*
  28.  * Custom headers:
  29.  */
  30.     #include "OS_DIRS.H"
  31.  
  32.     #include "SPEC_PU.H"
  33.     #include "S_MALLOC.H"
  34.     #include "DEBUG_PU.H"
  35.  
  36. /*
  37.  * Variables:
  38.  */
  39.     DTA    DTA_main;
  40.  
  41. /*
  42.  * ---------------------------------------------------------------------
  43.  */
  44.  
  45. /*
  46.  * Dirs_Init()
  47.  *
  48.  * 23.03.95: Created
  49.  */
  50. void Dirs_Init( void )
  51. {
  52.     TRACE0( "Initializing " THIS_FILE );
  53.  
  54.     /*
  55.      * Fixe DTA:
  56.      */
  57.     Fsetdta( &DTA_main );
  58. }
  59.  
  60.  
  61. /*
  62.  * Dir_Read(-)
  63.  *
  64.  * Lecture d'un directory et stockage en RAM
  65.  *
  66.  * 23.03.95: Created
  67.  * 24.03.95: V‚rifie qu'on a un path
  68.  * 25.03.95: utilisation d'un tableau
  69.  * 12.07.95: corrig‚ bug de realloc d'un ptr NULL
  70.  */
  71. int Dir_Read(                                     /* Out: Nbre d'elts dans dir */
  72.         char           * cpsz_Path,                /* In:  Chemin d'accŠs + masque */
  73.         DIRENTRY    *** pTpDirEnt,                /* Out: Tableau de ptrs sur DIRENT */
  74.         int          * pnb_TableEntries )    /* Out: Nbre d'entr‚es dans table */
  75. {
  76. #define    DIRTABLE_STEP    10
  77.  
  78.     DIRENTRY    *    pDirEnt_Current;    
  79.     DTA        *    pDTA;
  80.      int            FsRes;        
  81.     UINT            u_time;
  82.     UINT            u_date;
  83.      struct tm    time;
  84.      time_t        timet;
  85.     int            nb_DirEntries = 0;
  86.  
  87.     *pTpDirEnt = NULL;
  88.     *pnb_TableEntries = 0;
  89.  
  90.     /*
  91.      * V‚rifie adresse DTA:
  92.      */
  93.     pDTA = Fgetdta();
  94.     if( pDTA != &DTA_main )
  95.     {
  96.         signale( "DTA has moved!!!" );
  97.         return 0;
  98.     }     
  99.  
  100.     /*
  101.      * V‚rifie qu'on a un chemin d'accŠs avec masque de recherche:
  102.      */
  103.     if( cpsz_Path == NULL )
  104.     {
  105.         return 0;
  106.     }
  107.     
  108.     for( FsRes = Fsfirst( cpsz_Path, FA_SUBDIR );     
  109.             FsRes == 0;
  110.              FsRes = Fsnext() )
  111.     {
  112.          /* printf("Found: %X %s %ld\n", (int) DTA_main .d_attrib, DTA_main .d_fname, DTA_main .d_length ); */
  113.  
  114.         if( (DTA_main .d_attrib & FA_SUBDIR) && (DTA_main .d_fname)[0] == '.' )
  115.         {    
  116.             switch( (DTA_main .d_fname)[1] )
  117.             {
  118.                 case    '\0':
  119.                 case    '.':
  120.                     /*
  121.                      * Si nom de dossier "." ou commence par "..":
  122.                      * On ne se pr‚ocuupe pas de cette entr‚e
  123.                      */
  124.                     continue;
  125.             }
  126.         }
  127.  
  128.         /*
  129.          * Cr‚e une entr‚e de dir:
  130.          */
  131.         pDirEnt_Current = MALLOC( sizeof( DIRENTRY ) );
  132.         pDirEnt_Current -> uc_attrib = '\0';
  133.         pDirEnt_Current -> sz_fname[0] = '\0';
  134.         pDirEnt_Current -> ul_length = 0;
  135.         pDirEnt_Current -> time_LastChange = 0;
  136.         
  137.         /*
  138.          * On l'ajoute dans la liste
  139.          */
  140.         if( nb_DirEntries >= *pnb_TableEntries )
  141.         {    /*
  142.              * Si la liste est pleine, il faut l'agrandir
  143.              */
  144.             (*pnb_TableEntries) += DIRTABLE_STEP;
  145.             if( *pTpDirEnt == NULL )
  146.             {
  147.                 *pTpDirEnt = MALLOC( sizeof(DIRENTRY*) * (*pnb_TableEntries) );    
  148.             }
  149.             else
  150.             {
  151.                  *pTpDirEnt = REALLOC( *pTpDirEnt, sizeof(DIRENTRY*) * (*pnb_TableEntries) );    
  152.              }
  153.         }
  154.         (*pTpDirEnt)[ nb_DirEntries++ ] = pDirEnt_Current;
  155.         
  156.  
  157.         /*
  158.          * Sauve valeurs lues dans l'entr‚ee de DIR:
  159.          */
  160.         pDirEnt_Current -> uc_attrib = DTA_main .d_attrib;
  161.         strcpy( pDirEnt_Current -> sz_fname, DTA_main .d_fname );
  162.         pDirEnt_Current -> ul_length = DTA_main .d_length;
  163.  
  164.         /*
  165.          * Traduction de l'heure en format UNIX:
  166.          */
  167.          
  168.         u_time = DTA_main .d_time;
  169.         time .tm_sec  = (u_time & 0x001F) << 1;
  170.       time .tm_min  = (u_time & 0x07E0 ) >> 5;
  171.       time .tm_hour = (u_time & 0xF800 ) >> 11;
  172.  
  173.         u_date = DTA_main .d_date;
  174.         time .tm_mday = u_date & 0x001F;
  175.       time .tm_mon  = ((u_date & 0x01E0 ) >> 5) -1;    /* (0..11) */
  176.       time .tm_year = 80 + ((u_date & 0xFE00 ) >> 9);    /* (since 1900) */
  177.  
  178.       time .tm_wday = -1;    /* Wochentag (0..6) -> (So..Sa) */
  179.       time .tm_yday = -1;    /* Tag im Jahr (0..365)         */
  180.       time .tm_isdst = 0;
  181.         
  182.         timet = mktime( &time );
  183.         pDirEnt_Current -> time_LastChange = timet;
  184.         
  185.         /* printf( "date %X-%X     %d:%d:%d %d/%d/%d  %ld  %s\n",
  186.          *            u_time, u_date,
  187.          *            time .tm_hour, time .tm_min, time .tm_sec,
  188.          *            time .tm_mday, time .tm_mon +1, time .tm_year +1900,
  189.          *            timet,
  190.          *            ctime( &timet ) );
  191.          */
  192.      }
  193.  
  194.     /*
  195.      * Retourne la liste:
  196.      */
  197.     return     nb_DirEntries;
  198. }
  199.  
  200.  
  201.  
  202. /*
  203.  * Dir_Forget(-)
  204.  *
  205.  * Efface un dir charg‚ en m‚moire
  206.  *
  207.  * 24.03.95: Created
  208.  * 25.03.95: utilisation d'un tableau
  209.  */
  210. void Dir_Forget(
  211.         DIRENTRY    ** TpDirEnt,     /* In: Table de DirEntries */
  212.         int            nb_DirEnt )    /* Ib: Nbre d'entr‚es utilis‚es */
  213. {
  214.     int i;
  215.  
  216.     if( TpDirEnt == NULL )
  217.     {
  218.         return;
  219.     }
  220.  
  221.     for( i=0; i<nb_DirEnt; i++ )
  222.     {
  223.         FREE( TpDirEnt[i] );
  224.     }
  225.  
  226.     FREE( TpDirEnt );
  227. }
  228.  
  229.  
  230. /*
  231.  * Dir_Sort_Comp(-)
  232.  *
  233.  * Pour etre appell‚ par Dir_Sort()
  234.  *
  235.  * 25.03.95: Created
  236.  */
  237. int Dir_Sort_Comp(                     
  238.         DIRENTRY    ** pDirEnt1, 
  239.         DIRENTRY    ** pDirEnt2 )
  240. {
  241.     if( (*pDirEnt1) -> uc_attrib & FA_SUBDIR )
  242.     {
  243.         if( !((*pDirEnt2) -> uc_attrib & FA_SUBDIR) ) 
  244.         {
  245.             return -1;
  246.         }
  247.     }
  248.     else if( (*pDirEnt2) -> uc_attrib & FA_SUBDIR ) 
  249.     {
  250.         return 1;
  251.     }
  252.  
  253.     return strcmp( (*pDirEnt1) -> sz_fname, (*pDirEnt2) -> sz_fname );
  254. }
  255.  
  256. /*
  257.  * Dir_Sort(-)
  258.  *
  259.  * 25.03.95: Created
  260.  */
  261. void Dir_Sort(                     
  262.         DIRENTRY    ** TpDirEnt,    /* In: Tableau de ptrs sur DIRENT */
  263.         int             nb_DirEnt )    /* In: Nbre d'entr‚es utilis‚es dans table */
  264. {
  265.     qsort( TpDirEnt, nb_DirEnt, sizeof( DIRENTRY* ), Dir_Sort_Comp );
  266. }
  267.  
  268.  
  269. /*
  270.  * File_Exists(-)
  271.  *
  272.  * Dit si le fichier sp‚cifi‚ existe
  273.  *
  274.  * 25.03.95: Created
  275.  */
  276. BOOL    File_Exists(                         /* Out: True si existe */
  277.             const char * cpsz_Path )    /* In:  Chemin d'accŠs complet */
  278. {
  279.     if( Fsfirst( cpsz_Path, 0 ) == 0 )
  280.     {    /*
  281.          * Existe
  282.          */
  283.         return    TRUE_1;
  284.     }
  285.  
  286.     return FALSE0;        
  287. }